package main

import "fmt"

// 中介者模式试图解决网状关系的复杂关联，降低对象间的耦合度。
// 举个例子，假设一个十字路口上的车都是对象，
// 它们会执行不同的操作，前往不同的目的地，那么在十字路口指挥的交警就是“中介者”。
// 各个对象通过执行中介者接口，再由中介者维护对象之间的联系。
// 这能使对象变得更独立，比较适合用在一些对象是网状关系的案例上。

type p1 struct{}

func (p *p1) getMessage(data string) {
	fmt.Println("p1 get message: " + data)
}

type p2 struct{}

func (p *p2) getMessage(data string) {
	fmt.Println("p2 get message: " + data)
}

type p3 struct{}

func (p *p3) getMessage(data string) {
	fmt.Println("p3 get message: " + data)
}

type Message struct {
	p1 *p1
	p2 *p2
	p3 *p3
}

func (m *Message) sendMessage(i interface{}, data string) {
	switch i.(type) {
	case *p1:
		m.p2.getMessage(data)
	case *p2:
		m.p1.getMessage(data)
	case *p3:
		m.p1.getMessage(data)
		m.p2.getMessage(data)
	}
}

func ExampleMediator() {
	message := &Message{}

	p1 := &p1{}
	p2 := &p2{}
	p3 := &p3{}

	message.sendMessage(p1, "hi! my name is p1")
	message.sendMessage(p2, "my name is p2")
	message.sendMessage(p3, "my name is p3")
}
